/**
 * 版权声明：中图一购网络科技有限公司 版权所有 违者必究 2012
 * 日    期：12-7-27
 */
package com.jprass.sample.converter;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 时间日期的工具类
 *
 * @author : chenxh(quickselect@163.com)
 * @date: 13-7-1
 */
public class DateUtils {

	public static final String DATETIME_FORMAT = "yyyyMMddHHmmss";
	public static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat(DATETIME_FORMAT);
	public static final String DATE_FORMAT = "yyyyMMdd";
	public static final String SHOW_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	public static final String SHOW_DATE_FORMAT = "yyyy-MM-dd";

	/**
	 * 获取当前时间串，格式为：yyyymmddHHMiSS
	 *
	 * @return
	 */
	public static final String getCurrDatetime() {
		return format(new Date(), DATETIME_FORMAT);
	}

	/**
	 * 获取当前日期串，格式为yyyymmdd
	 *
	 * @return
	 */
	public static final String getCurrDate() {
		return format(new Date(), DATE_FORMAT);
	}

	/**
	 * @param date
	 *            时间
	 * @param formatStr
	 *            格式化串
	 * @return
	 */
	public static String format(Date date, String formatStr) {
		SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
		return sdf.format(date);
	}

	/**
	 * 对{@code date}字符串，采用<code>0</code>右补齐到{@code length}的长度
	 *
	 * @param date
	 * @param length
	 * @return
	 */
	public static String pad0(String date, int length) {
		return padChar(date, length, '0');
	}

	/**
	 * 对{@code date}字符串，采用<code>9</code>右补齐到{@code length}的长度
	 *
	 * @param date
	 * @param length
	 * @return
	 */
	public static String pad9(String date, int length) {
		return padChar(date, length, '9');
	}

	private static String padChar(String date, int length, char theChar) {
		if (StringUtils.isEmpty(date)) {
			date = "";
		}
		return StringUtils.rightPad(date, length, theChar);
	}

	/**
	 * {@code time1}是否小于{@code time2},即类似于
	 * 
	 * <pre>
	 * time1 < time2
	 * </pre>
	 * 
	 * 。 如果{@code time2}为<code>null</code>， 则视为最小。
	 *
	 * @param time1
	 *            时间字符串，格式为 yyyyMMddHHmmss，不足14位后补0
	 * @param time2
	 *            时间字符串，格式为 yyyyMMddHHmmss，不足14位后补0
	 * @return
	 */
	public static boolean lessThan(String time1, String time2) {
		if (StringUtils.isEmpty(time1)) {
			if (StringUtils.isEmpty(time2)) {
				return false;
			} else {
				return true;
			}
		} else {
			return time1.compareTo(time2) < 0;
		}
	}

	/**
	 * {@code time1}是否大于{@code time2},即类似于
	 * 
	 * <pre>
	 * time1 > time2
	 * </pre>
	 * 
	 * 。如果{@code time2}为<code>null</code>， 则视为最大。
	 *
	 * @param time1
	 *            时间字符串，格式为 yyyyMMddHHmmss，不足14位后补9
	 * @param time2
	 *            时间字符串，格式为 yyyyMMddHHmmss，不足14位后补9
	 * @return
	 */
	public static boolean greaterThan(String time1, String time2) {
		if (StringUtils.isEmpty(time1)) {
			if (StringUtils.isEmpty(time2)) {
				return false;
			} else {
				return true;
			}
		} else {
			return time1.compareTo(time2) > 0;
		}
	}

	/**
	 * 将<code>datetime</code>字符串时间转换为毫秒数
	 * 
	 * @param datetime
	 *            长度必须大于等于8而小于等于14，格式为 yyyyMMddHHmmss，不足14位后补0
	 * @return
	 */
	public static long toMilliseconds(String datetime) {
		return parseDate(datetime).getTime();
	}

	/**
	 * 将格式为{@link #DATETIME_FORMAT}的时间格式解析为Date对象,{@code datetime}的长度必须大于8小于14.
	 * 
	 * @param datetime
	 * @return
	 */
	public static Date parseDate(String datetime) {
		Assert.notNull(datetime);
		Assert.isTrue(datetime.length() >= 4 && datetime.length() <= 14, "长度必须大于等于8而小于等于14");
		DateFormat dateFormat = SIMPLE_DATE_FORMAT;
		try {
			if (datetime.length() < 14) {
				dateFormat = new SimpleDateFormat(DATETIME_FORMAT.substring(0, datetime.length()));
			}
			return dateFormat.parse(datetime);
		} catch (ParseException e) {
			throw new IllegalArgumentException("入参datetime：" + datetime + "解析异常，请检查格式必须为：" + DATETIME_FORMAT);
		}
	}

	/**
	 * 将字符串时间解析为对象
	 * 
	 * @param datetime
	 * @param format
	 * @return
	 */
	public static Date parseDate(String datetime, String format) {
		Assert.notNull(datetime);
		Assert.notNull(format);
		Assert.isTrue(datetime.length() == format.length(), "值和格式串的长度不一致");
		DateFormat dateFormat = new SimpleDateFormat(format);
		try {
			return dateFormat.parse(datetime);
		} catch (ParseException e) {
			throw new IllegalArgumentException("入参datetime：" + datetime + "解析异常，请检查格式必须为：" + format);
		}
	}
}
